From d2e0553384cca0bcd7c2a7df404e1e44bf82f8d4 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 31 Mar 2019 21:53:55 -0400 Subject: [PATCH] Fix menuitem hover We need to pay attention to details of enter and leave events. Closes: https://gitlab.gnome.org/GNOME/gtk/issues/1795 --- gtk/gtkmenuitem.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/gtk/gtkmenuitem.c b/gtk/gtkmenuitem.c index e7213ebe58..61519beccc 100644 --- a/gtk/gtkmenuitem.c +++ b/gtk/gtkmenuitem.c @@ -1128,6 +1128,7 @@ gtk_menu_item_enter (GtkEventController *controller, GtkMenuItem *menu_item = GTK_MENU_ITEM (user_data); GtkWidget *menu_shell; GdkEvent *event; + gboolean is_focus, contains_focus; event = gtk_get_current_event (); /* FIXME controller event */ @@ -1142,8 +1143,14 @@ gtk_menu_item_enter (GtkEventController *controller, menu_shell = gtk_widget_get_parent (GTK_WIDGET (menu_item)); + g_object_get (controller, + "is-pointer-focus", &is_focus, + "contains-pointer-focus", &contains_focus, + NULL); + if (GTK_IS_MENU_SHELL (menu_shell) && - GTK_MENU_SHELL (menu_shell)->priv->active) + GTK_MENU_SHELL (menu_shell)->priv->active && + (is_focus || contains_focus)) gtk_menu_shell_select_item (GTK_MENU_SHELL (menu_shell), GTK_WIDGET (menu_item)); } @@ -1155,8 +1162,16 @@ gtk_menu_item_leave (GtkEventController *controller, { GtkMenuItem *menu_item = GTK_MENU_ITEM (user_data); GtkWidget *menu_shell = gtk_widget_get_parent (GTK_WIDGET (menu_item)); + gboolean is_focus, contains_focus; + + g_object_get (controller, + "is-pointer-focus", &is_focus, + "contains-pointer-focus", &contains_focus, + NULL); - if (GTK_IS_MENU_SHELL (menu_shell) && !menu_item->priv->submenu) + if (GTK_IS_MENU_SHELL (menu_shell) && + !menu_item->priv->submenu && + !(is_focus || contains_focus)) gtk_menu_shell_deselect (GTK_MENU_SHELL (menu_shell)); } -- 2.30.2